﻿using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace YiTian.Core.Modularity
{
    /// <summary>
    /// IServiceCollection 模块化扩展方法
    /// </summary>
    public static class ModuleServiceCollectionExtensions
    {
        /// <summary>
        /// 向服务集合添加模块化支持并加载模块
        /// </summary>
        /// <param name="services">服务集合</param>
        /// <param name="configureOptions">模块选项配置</param>
        /// <returns>服务集合（链式调用）</returns>
        public static IServiceCollection AddModules(
            this IServiceCollection services)
        {

            // 2. 注册模块核心服务
            services.AddSingleton<IModuleDiscoverer, ModuleDiscoverer>();
            services.AddSingleton<IModuleLoader, ModuleLoader>();

            // 3. 加载模块并执行服务配置
            var serviceProvider = services.BuildServiceProvider(); // 临时构建容器获取服务
            var moduleLoader = serviceProvider.GetRequiredService<IModuleLoader>();
            var loadedModules = moduleLoader.LoadModules(AppDomain.CurrentDomain.BaseDirectory);

            // 4. 注册已加载的模块为单例（供后续使用）
            foreach (var module in loadedModules)
            {
                services.AddSingleton(module);
            }
            services.AddSingleton<IReadOnlyList<IModule>>(loadedModules);

            // 5. 执行模块的服务配置（按依赖顺序）
            var configContext = new ModuleConfigurationContext(services);
            foreach (var module in loadedModules)
            {
                module.ConfigureServices(configContext);
            }

            return services;
        }

    }
}
